import trigger from "../../effect/trigger.js";
import { TriggerOpTypes, hasChanged } from "../../utils.js";
/**
 * 设置一个属性
 * @param {*} target  原始对象
 * @param {*} key 数据
 * @param {*} value 设置的值
 */
export default function (target, key, value) {
  let type = target.hasOwnProperty(key)
    ? TriggerOpTypes.SET
    : TriggerOpTypes.ADD;

  const oldVal = target[key];
  // 如果原始对象是个数组，则缓数组的长度
  const oldLen = Array.isArray(target) ? target.length : undefined;

  const result = Reflect.set(target, key, value);

  // 是否需要派发更新，需要看属性值是否变化
  if (hasChanged(oldVal, value)) {
    trigger(target, type, key);

    // 如果是通过隐式的修改数组长度，则派发更新
    if (Array.isArray(target) && oldLen !== target.length) {
      // 这里判断是否为隐式操作
      if (key !== "length") {
        trigger(target, TriggerOpTypes.SET, "length");
      } else {
        // 如果数组长度减少，则需要删除多余的属性
        for (let i = target.length; i < oldLen; i++) {
          trigger(target, TriggerOpTypes.DELETE, i);
        }
      }
    }
  }

  return result;
}
